/*Copyright (C) 2009 - 2011 MASSART GAUTHIER

This program is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.

You should have received a copy of the GNU Lesser General Public
License along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/

#include "../headers.h"

void excit_affichage_mat(char matrice[1000], char niveau[50], char auteur[100], long temps_ms, int niveau_actuel, int nombre_niveau) {
	short k = 0, y = 5, x = x_begin_center(50);
	int min = temps_ms / 60000, sec = temps_ms / 1000;
	CSLP_ColorText(COLOR_WHITE);
	move(y, x);
	save_cursor_pos();

	while(k != 1000) {
		move(y, x);

		if(matrice[k] == '#') {
			CSLP_ColorText(COLOR_WHITE);
			afficher_char_fullblock(1, COLOR_WHITE);
		}
		else if(matrice[k] == '1') {
			CSLP_ColorText(COLOR_WHITE);
			addstr("└");
		}
		else if(matrice[k] == '3') {
			CSLP_ColorText(COLOR_WHITE);
			addstr("┘");
		}
		else if(matrice[k] == '7') {
			CSLP_ColorText(COLOR_WHITE);
			addstr("┌");
		}
		else if(matrice[k] == '9') {
			CSLP_ColorText(COLOR_WHITE);
			addstr("┐");
		}
		else if(matrice[k] == '|') {
			CSLP_ColorText(COLOR_WHITE);
			addstr("│");
		}
		else if(matrice[k] == '_') {
			CSLP_ColorText(COLOR_WHITE);
			addstr("─");
		}
		else if(matrice[k] == 'J') {
			CSLP_ColorText(COLOR_YELLOW);
			addstr("☺");
		}
		else if(matrice[k] == 'O') {
			CSLP_ColorText(COLOR_GREEN);
			addstr("◙");
		}
		else {
			CSLP_ColorText(COLOR_WHITE);
			addch(matrice[k]);
		}

		x++;
		k++;

		if(x == x_begin_center(50) + 50) {
			x = x_begin_center(50);
			y++;
		}
	}


	CSLP_ColorText(COLOR_WHITE);
	mvaddstr(26, x_begin_center(50), "Temps :");
	CSLP_ColorText(CT);
	printw(" %i min %i.%i sec ", min, sec % 60, temps_ms % 1000);
	CSLP_ColorText(COLOR_WHITE);
	mvaddstr(27, x_begin_center(50), "Auteur : ");
	CSLP_ColorText(CT);
	printw(" %s        ", auteur);
	CSLP_ColorText(COLOR_WHITE);
	mvaddstr(28, x_begin_center(50), "Niveau actuel :");
	CSLP_ColorText(CT);
	printw(" %i ", niveau_actuel);

	CSLP_ColorText(COLOR_WHITE);
	mvaddstr(27, x_begin_center(50) + 25, "Niveau : ");
	CSLP_ColorText(CT);
	printw(" %s        ", niveau);
	CSLP_ColorText(COLOR_WHITE);
	mvaddstr(28, x_begin_center(50) + 25, "Nombre de niveaux :");
	CSLP_ColorText(CT);
	printw(" %i ", nombre_niveau);
	CSLP_ColorText(COLOR_WHITE);

	restore_cursor_pos();
	addstr("┌");
	pmove(DROITE, 48);
	addstr("┐");
	pmove(BAS, 19);
	pmove(GAUCHE, 1);
	addstr("┘");
	pmove(GAUCHE, 50);
	addstr("└");

	CSLP_ColorText(CT);

}

/* Fonction affichant l'écran d'édition
*/
void excit_display_editor(EXCIT_CASE_T matrix[EXCIT_MAT_X][EXCIT_MAT_Y], EXCIT_INF_T *inf)
{
	clear();
	/* Titre */
	afficher_titre(TITRE_EXCIT);
	/* Matrice */
	excit_display_matrix(matrix);
	/* Informations sur le jeu */
	excit_refresh_editor_inf(inf);
	move(14, x_begin_center(50) - 27);
	CSLP_ColorText(COLOR_RED);
	afficher_char_bullet(1);
	CSLP_ColorText(CT);
	addstr("Liste des touches :");
	CSLP_ColorText(COLOR_RED);
	mvprintw(15, x_begin_center(50) - 25, "%c", EXCIT_KEY_QUIT);
	CSLP_ColorText(CT);
	addstr(" : Quitter");
	CSLP_ColorText(COLOR_RED);
	mvprintw(16, x_begin_center(50) - 25, "%c", EXCIT_KEY_EMUR);
	CSLP_ColorText(CT);
	addstr(" : Ajouter un mur");
	CSLP_ColorText(COLOR_RED);
	mvprintw(17, x_begin_center(50) - 25, "%c", EXCIT_KEY_EVIDE);
	CSLP_ColorText(CT);
	addstr(" : Vider la case");
	CSLP_ColorText(COLOR_RED);
	mvprintw(18, x_begin_center(50) - 25, "%c", EXCIT_KEY_EJOUEUR);
	CSLP_ColorText(CT);
	addstr(" : Placer le joueur");
	CSLP_ColorText(COLOR_RED);
	mvprintw(19, x_begin_center(50) - 25, "%c", EXCIT_KEY_EOBJECTIF);
	CSLP_ColorText(CT);
	addstr(" : Placer l'objectif");
	move(15, x_begin_center(50) + 60);
	CSLP_ColorText(COLOR_RED);
	afficher_touche(touche_haut);
	CSLP_ColorText(CT);
	addstr(" : Se déplacer vers le haut");
	move(16, x_begin_center(50) + 60);
	CSLP_ColorText(COLOR_RED);
	afficher_touche(touche_bas);
	CSLP_ColorText(CT);
	addstr(" : Se déplacer vers le bas");
	move(17, x_begin_center(50) + 60);
	CSLP_ColorText(COLOR_RED);
	afficher_touche(touche_droite);
	CSLP_ColorText(CT);
	addstr(" : Se déplacer vers la droite");
	move(18, x_begin_center(50) + 60);
	CSLP_ColorText(COLOR_RED);
	afficher_touche(touche_gauche);
	CSLP_ColorText(CT);
	addstr(" : Se déplacer vers la gauche");

	refresh();
}

/* Fonction affichant la légende
*/
void excit_afficher_infos(void) {
	CSLP_ColorText(CT);
	mvaddstr(5, x_begin_center(50) - 25, "Touche Haut   : ");
	CSLP_ColorText(COLOR_RED);

	if(touche_haut != KEY_UP) {
		addch(touche_haut);
	}
	else {
		addstr("[↑]");
	}

	CSLP_ColorText(CT);
	mvaddstr(6, x_begin_center(50) - 25, "Touche Bas    : ");
	CSLP_ColorText(COLOR_RED);

	if(touche_bas != KEY_DOWN) {
		addch(touche_bas);
	}
	else {
		addstr("[↓]");
	}

	CSLP_ColorText(CT);
	mvaddstr(7, x_begin_center(50) - 25, "Touche Droite : ");
	CSLP_ColorText(COLOR_RED);

	if(touche_droite != KEY_RIGHT) {
		addch(touche_droite);
	}
	else {
		addstr("[→]");
	}

	CSLP_ColorText(CT);
	mvaddstr(8, x_begin_center(50) - 25, "Touche Gauche : ");
	CSLP_ColorText(COLOR_RED);

	if(touche_gauche != KEY_LEFT) {
		addch(touche_gauche);
	}
	else {
		addstr("[←]");
	}

	CSLP_ColorText(COLOR_YELLOW);
	mvaddstr(5, x_begin_center(50) + 60, "☺");
	CSLP_ColorText(CT);
	addstr(" : Vous");
	CSLP_ColorText(COLOR_GREEN);
	mvaddstr(6, x_begin_center(50) + 60, "◙");
	CSLP_ColorText(CT);
	addstr(" : Objectif");
}

/* Fonction affichant la matrice
*/
void excit_display_matrix(EXCIT_CASE_T matrix[EXCIT_MAT_X][EXCIT_MAT_Y]) {
	int y, x;

	for(y = 0; y < EXCIT_MAT_Y; y++) {
		move(EXCIT_MAT_ORG_Y + y, EXCIT_MAT_ORG_X);

		for(x = 0; x < EXCIT_MAT_X; x++) {
			excit_display_case(matrix[x][y]);
		}
	}

	move(EXCIT_MAT_ORG_Y, EXCIT_MAT_ORG_X);

	addstr("┌");
	pmove(DROITE, 50);
	addstr("┐");
	pmove(BAS, 20);
	addstr("┘");
	pmove(GAUCHE, 50);
	addstr("└");

}

/* Fonction rafraichissant les informations sur l'édition en cours
*/
void excit_refresh_editor_inf(EXCIT_INF_T *inf) {
	move(27, x_begin_center(50));
	clear_line();
	move(27, x_begin_center(50));
	CSLP_ColorText(CT);

	if(inf->pos_objectif.x < 0 || inf->pos_objectif.y < 0) {
		addstr("L'objectif n'est pas placé.    ");
	}
	else {
		addstr("L'objectif est placé.          ");
	}

	if(inf->pos_joueur.x < 0 || inf->pos_joueur.y < 0) {
		addstr("Le joueur n'est pas placé.     ");
	}
	else {
		addstr("Le joueur est placé.           ");
	}
}

/* Fonction permettant d'afficher une case
*/
void excit_display_case(EXCIT_CASE_T cel) {
	if(cel == EXCIT_MUR) {
		CSLP_ColorText(EXCIT_COL_MUR);
		addstr(EXCIT_WCH_MUR);
	}
	else if(cel == EXCIT_BORD_DG) {
		CSLP_ColorText(EXCIT_COL_MUR);
		addstr(EXCIT_WCH_BORD_DG);
	}
	else if(cel == EXCIT_BORD_HB) {
		CSLP_ColorText(EXCIT_COL_MUR);
		addstr(EXCIT_WCH_BORD_HB);
	}
	else if(cel == EXCIT_JOUEUR) {
		CSLP_ColorText(EXCIT_COL_JOUEUR);
		addstr(EXCIT_WCH_JOUEUR);
	}
	else if(cel == EXCIT_OBJECTIF) {
		CSLP_ColorText(EXCIT_COL_OBJECTIF);
		addstr(EXCIT_WCH_OBJECTIF);
	}
	else if(cel == EXCIT_VIDE) {
		addch(' ');
	}
}

/* Fonction rafraichissant la valeur d'une case
*/
void excit_refresh_case(IPoint *pos, EXCIT_CASE_T value) {
	if(pos != NULL) {
		move(pos->y + EXCIT_MAT_ORG_Y, pos->x + EXCIT_MAT_ORG_X);
	}

	excit_display_case(value);
	refresh();
}
